package org.walklink.core.config;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.Properties;
import java.util.function.Function;

/**
 * 工具环境工具类
 *
 * @author lidishan
 * @date 2021/4/23
 */
public class ConfigHelper {

    private static final Logger LOGGER = LogManager.getLogger(ConfigHelper.class);

    /**
     * 从DEFAULT_CONFIG_FILE_NAME加载到的配置文件
     */
    private static Properties CONFIG_PROPERTIES;

    private ConfigHelper() {}

    /**
     * 获取单例配置
     */
    public static Properties getInstance() {
        if (CONFIG_PROPERTIES == null) {
            synchronized (ConfigHelper.class) {
                if (CONFIG_PROPERTIES == null) {
                    CONFIG_PROPERTIES = new Properties();
                }
            }
        }
        return CONFIG_PROPERTIES;
    }

    /**
     * 获取字符串类型参数
     * @param key 参数名称
     */
    public static String getString(String key) {
        return getString(key, null);
    }

    /**
     * 获取字符串类型参数（带默认值）
     * @param key 参数名称
     * @param defaultVal 默认值
     */
    public static String getString(String key, String defaultVal) {
        return getProperty(key, String.class::cast, defaultVal);
    }

    /**
     * 获取整形类型参数
     * @param key 参数名称
     */
    public static Integer getInt(String key) {
        return getInt(key, null);
    }

    /**
     * 获取整形类型参数（带默认值）
     * @param key 参数名称
     * @param defaultVal 默认值
     */
    public static Integer getInt(String key, Integer defaultVal) {
        return getProperty(key, (value) -> Integer.valueOf(String.valueOf(value)), defaultVal);
    }

    /**
     * 通用Property属性获取方法
     *
     * @param key 属性名
     * @param function 处理方法
     * @param defaultValue 默认值
     */
    public static <T> T getProperty(String key, Function<Object, T> function, T defaultValue) {
        try {
            Object value = CONFIG_PROPERTIES.get(key);

            if (value != null) {
                return function.apply(value);
            }
        } catch (Exception ex) {
            LOGGER.error("configHelper getProperty error, key={} defaultValue={}", key, defaultValue, ex);
        }

        return defaultValue;
    }





}
